package ar.uba.fi.tecnicas.fabrica;

import java.awt.Point;

import ar.uba.fi.tecnicas.fabrica.exceptions.ItemsEnConexionConDiferentePadreException;
import ar.uba.fi.tecnicas.fabrica.exceptions.PiezaInvalidaException;

public class Cinta extends ItemLineaProduccion implements IConector
{
	/**
	 * Constructor de cinta
	 */
	public Cinta()
	{
	}
	
	/**
	 * Procesa la pieza, en realidad no realiza ninguna operacion
	 */
	public void procesar()
	{		
	}

	public void conectar(IConectable origen, IConectable destino) throws ItemsEnConexionConDiferentePadreException
	{
		if(!origen.verificarPadre(this.lineaProduccion) || !destino.verificarPadre(this.lineaProduccion))
		{
			this.lineaProduccion.quitarItem(this);
			throw new ItemsEnConexionConDiferentePadreException();
		}

		this.entrada = (ItemLineaProduccion)origen;
		this.salida = (ItemLineaProduccion)destino;
		origen.setearSalida(this);
		destino.setearEntrada(this);
		
		this.entrada.notifyObservers();
	}

	protected void validarIngresar(Pieza pieza) throws PiezaInvalidaException 
	{
		if(pieza.getTransformaciones().size() == 0)
		{
			throw new PiezaInvalidaException();
		}
	}
	
	public void setearEntrada(IConectable entrada)
	{
		this.entrada = (ItemLineaProduccion)entrada;
	}

	public void setearSalida(IConectable salida)
	{
		this.salida = (ItemLineaProduccion)salida;
	}
	
	public ItemLineaProduccionInfo getInfo()
	{
		return new ItemLineaProduccionInfo("Cinta", "Cinta transportadora.");
	}
	
	public static double calcularDistancia(IConectable origen, IConectable destino)
	{
		ItemLineaProduccion origenItem = (ItemLineaProduccion)origen;
		ItemLineaProduccion destinoItem = (ItemLineaProduccion)destino;
		
		Point origenPosicion = origenItem.getPosicion().getPosicion();
		Point destinoPosicion = destinoItem.getPosicion().getPosicion();
		
		return Math.sqrt(
			Math.pow(origenPosicion.x - destinoPosicion.x, 2) +
			Math.pow(origenPosicion.y - destinoPosicion.y, 2)
		);
	}
}
